package br.com.estevam.sisfin.tools;

public final class ValidarCpfOrCnpj {

	/*
	 * Método usado para validação do CPF
	 */
	public ValidarCpfOrCnpj() {
	}

	public static boolean CPF(String strCpf) { // formato XXX.XXX.XXX-XX
		if(strCpf != null && strCpf.length() > 0){
			try {

				int d1, d2;
				int digito1, digito2, resto;
				int digitoCPF;
				String nDigResult;
				strCpf = strCpf.replace('.', ' ');
				strCpf = strCpf.replace('-', ' ');
				strCpf = strCpf.replaceAll(" ", "");
				
				if(strCpf.length() != 11){
					return false;
				}
				
				d1 = d2 = 0;
				digito1 = digito2 = resto = 0;

				for (int nCount = 1; nCount < strCpf.length() - 1; nCount++) {
					digitoCPF = Integer.valueOf(strCpf.substring(nCount - 1, nCount)).intValue();

					// multiplique a ultima casa por 2 a seguinte por 3 a
					// seguinte por 4 e assim por diante.
					d1 = d1 + (11 - nCount) * digitoCPF;

					// para o segundo digito repita o procedimento incluindo o
					// primeiro digito calculado no passo anterior.
					d2 = d2 + (12 - nCount) * digitoCPF;
				}

				// Primeiro resto da divisão por 11.
				resto = (d1 % 11);

				// Se o resultado for 0 ou 1 o digito é 0 caso contrário o
				// digito é 11 menos o resultado anterior.
				if (resto < 2)
					digito1 = 0;
				else
					digito1 = 11 - resto;

				d2 += 2 * digito1;

				// Segundo resto da divisão por 11.
				resto = (d2 % 11);

				// Se o resultado for 0 ou 1 o digito é 0 caso contrário o
				// digito é 11 menos o resultado anterior.
				if (resto < 2)
					digito2 = 0;
				else
					digito2 = 11 - resto;

				// Digito verificador do CPF que está sendo validado.
				String nDigVerific = strCpf.substring(strCpf.length() - 2, strCpf.length());

				// Concatenando o primeiro resto com o segundo.
				nDigResult = String.valueOf(digito1) + String.valueOf(digito2);

				// comparar o digito verificador do cpf com o primeiro resto + o
				// segundo resto.
				
				return (nDigVerific.equals(nDigResult));

			} catch (Exception e) {
				return false;
			}
		} else {
			return false;
		}
	}

	/*
	 * Método usado para validação do CNPJ
	 * 
	 * Ex: 02998301000181
	 */

	public static boolean CNPJ(String strCnpj) {
		if(strCnpj != null && strCnpj.length() > 0){
			
			strCnpj = strCnpj.replace('.', ' ');
			strCnpj = strCnpj.replace('-', ' ');
			strCnpj = strCnpj.replaceAll(" ", "");
			
			if (strCnpj.length() != 14){
				return false;
			}

			int soma = 0, dig;
			String nDigResult = strCnpj.substring(0, 12);
			char[] chrCnpj = strCnpj.toCharArray();

			/* Primeira parte */
			for (int i = 0; i < 4; i++){
				if (chrCnpj[i] - 48 >= 0 && chrCnpj[i] - 48 <= 9){
					soma += (chrCnpj[i] - 48) * (6 - (i + 1));
				}
			}

			for (int i = 0; i < 8; i++){
				if (chrCnpj[i + 4] - 48 >= 0 && chrCnpj[i + 4] - 48 <= 9){
					soma += (chrCnpj[i + 4] - 48) * (10 - (i + 1));
				}
			}

			dig = 11 - (soma % 11);

			nDigResult += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);

			/* Segunda parte */
			soma = 0;
			for (int i = 0; i < 5; i++){
				if (chrCnpj[i] - 48 >= 0 && chrCnpj[i] - 48 <= 9){
					soma += (chrCnpj[i] - 48) * (7 - (i + 1));
				}
			}
			for (int i = 0; i < 8; i++){
				if (chrCnpj[i + 5] - 48 >= 0 && chrCnpj[i + 5] - 48 <= 9){
					soma += (chrCnpj[i + 5] - 48) * (10 - (i + 1));
				}
			}

			dig = 11 - (soma % 11);
			nDigResult += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);

			return (strCnpj.equals(nDigResult));
		}
		
		return false;
	}
	
	public static void main(String[] args) {
		String cpf = "02028421341";
		System.out.println(CPF(cpf));
	}

}
